<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>垃圾回收机制</title>
</head>
<body>
<h3>垃圾回收机制</h3>
<p>
    学习路径： <br>
    1. 什么是垃圾回收机制 <br>
    2. 内存的声明周期 <br>
    3. 垃圾回收的算法说明
</p>
<hr>

<h4>1. 什么是垃圾回收机制？</h4>
<p>
    垃圾回收机制(Garbage Collection) 简称 GC <br>
    JS中内存的分配和回收都是自动完成的，内存在不使用的时候会被垃圾回收器自动回收。 <br>
    正因为垃圾回收器的存在，许多人认为JS不用太关心内存管理的问题 <br>
    但如果不了解JS的内存管理机制，我们同样非常容易成内存泄漏（内存无法被回收）的情况 <br>
    不再用到的内存，没有及时释放，就叫做 内存泄漏
</p>

<h4>2.内存的生命周期</h4>
<p>
    JS环境中分配的内存, 一般有如下生命周期： <br>
    1. 内存分配：当我们声明变量、函数、对象的时候，系统会自动为他们分配内存 <br>
    2. 内存使用：即读写内存，也就是使用变量、函数等 <br>
    3. 内存回收：使用完毕，由垃圾回收自动回收不再使用的内存 <br>
    4. 说明： <br>
    全局变量一般不会回收(关闭页面回收)； <br>
    一般情况下局部变量的值, 不用了, 会被自动回收掉
</p>
<hr>
<hr>

<h4>拓展-JS垃圾回收机制-算法说明</h4>
<p>
    堆栈空间分配区别： <br>
    1. 栈（操作系统）: 由 操作系统自动分配释放 函数的参数值、局部变量等，基本数据类型放到栈里面。 <br>
    2. 堆（操作系统）: 一般由程序员分配释放，若程序员不释放，由 垃圾回收机制 回收。复杂数据类型放到堆里面。
</p>
<hr>

<p>下面介绍两种常见的浏览器垃圾回收算法: 引用计数法 和 标记清除</p>
<h4>引用计数 (了解下就行,已经淘汰)</h4>
<p>
    IE采用的引用计数算法, 定义“内存不再使用”，就是看一个对象是否有指向它的引用，没有引用了就回收对象 <br>
    算法： <br>
    1. 跟踪记录被引用的次数 <br>
    2. 如果被引用了一次，那么就记录次数1,多次引用会累加 ++ <br>
    3. 如果减少一个引用就减1 -- <br>
    4. 如果引用次数是0 ，则释放内存
</p>
<p>
    但它却存在一个致命的问题：嵌套引用（循环引用） <br>
    如果两个对象相互引用，尽管他们已不再使用，垃圾回收器不会进行回收，导致内存泄露。 <br>
    因为他们的引用次数永远不会是0。这样的相互引用如果说很大量的存在就会导致大量的内存泄露
</p>
<h4>标记清除</h4>
<p>
    现代的浏览器已经不再使用 引用计数算法 了。 <br>
    现代浏览器通用的大多是基于 标记清除算法 的某些改进算法，总体思想都是一致的。 <br>
    核心： <br>
    1. 标记清除算法将“不再使用的对象”定义为 “无法达到的对象”。 <br>
    2. 就是从 根部（在JS中就是全局对象）出发定时扫描内存中的对象。 凡是能从 根部到达 的对象，都是还 需要使用的。 <br>
    3. 那些 无法 由根部出发触及到的对象被标记为不再使用，稍后进行 回收
</p>
</body>
</html>